/*
 * Copyright (c) 2001-2006 Accenture LLC.
 * All Rights Reserved.
 *
 * This software is the confidential and proprietary information of
 * Accenture. ("Confidential Information"). You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Accenture.
 *
 * ACCENTURE MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
 * SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
 * BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. ACCENTURE
 * SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
 * RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES.
 */
package org.tigris.jelements;

import org.tigris.mappedlexer.validator.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author zhisen.huang
 * 
 */
public class ClassProduction extends AbstractProduction {

	protected Production classBodyProduction = null;

	protected Validator modifierValidator = null;

	protected static Log logger = LogFactory.getLog(ClassProduction.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.tigris.javaclue.Production#parse()
	 */
	public void parse() throws Exception {
		tk = lexer.nexttok(VerifyHub.IDENTIFIER);
		while (modifierValidator.validate(tk)) {
			tk = lexer.nexttok(VerifyHub.IDENTIFIER);
		}
		tk = lexer.nexttok(VerifyHub.IDENTIFIER);
		logger.info("class name: " + tk);
		tk = lexer.nexttok();
		if(tk.equals("extends")) {
			while(!tk.equals("{")){
				tk = lexer.nexttok(VerifyHub.IDENTIFIER);
				tk = lexer.nexttok(",", "{");
			}
			lexer.backward(tk);
		}
		classBodyProduction.setLexer(lexer);
		classBodyProduction.parse();
	}

	/**
	 * @param classBodyProduction
	 *            the classBodyProduction to set
	 */
	public void setClassBodyProduction(Production classBodyProduction) {
		this.classBodyProduction = classBodyProduction;
	}

	/**
	 * @param modifierValidator
	 *            the modifierValidator to set
	 */
	public void setModifierValidator(Validator modifierValidator) {
		this.modifierValidator = modifierValidator;
	}

}
